﻿@model DiscountModel

@using Nop.Core.Domain.Discounts;
@using Telerik.Web.Mvc.UI;
@using Nop.Web.Framework.UI;
@{
    Html.AddScriptParts("~/Administration/Scripts/jquery.tmpl.min.js");
}
@Html.ValidationSummary(false)
@Html.HiddenFor(model => model.Id)
@Html.Telerik().TabStrip().Name("discount-edit").Items(x =>
{
    x.Add().Text(T("Admin.Promotions.Discounts.Info").Text).Content(TabInfo().ToHtmlString()).Selected(true);
    x.Add().Text(T("Admin.Promotions.Discounts.Requirements").Text).Content(TabRequirements().ToHtmlString());
    if (Model.Id > 0)
    {
        x.Add().Text(T("Admin.Promotions.Discounts.History").Text).Content(TabHistory().ToHtmlString());
    }
    
    //generate an event
    EngineContext.Current.Resolve<IEventPublisher>().Publish(new AdminTabStripCreated(x, "discount-edit"));
})
@helper TabInfo()
    {
        
        
    <script type="text/javascript">
            $(document).ready(function () {
                $("#@Html.FieldIdFor(model => model.DiscountTypeId)").change(toggleDiscountType);
                $("#@Html.FieldIdFor(model => model.UsePercentage)").click(toggleUsePercentage);
                $("#@Html.FieldIdFor(model => model.RequiresCouponCode)").click(toggleRequiresCouponCode);
                $("#@Html.FieldIdFor(model => model.DiscountLimitationId)").change(toggleLimitation);

                toggleDiscountType();
                toggleLimitation();
                toggleUsePercentage();
                toggleRequiresCouponCode();
            });
            
            function toggleDiscountType() {
                var selectedDiscountTypeId = $("#@Html.FieldIdFor(model => model.DiscountTypeId)").val();
                if (selectedDiscountTypeId == @(((int)DiscountType.AssignedToCategories).ToString())) {
                    $('#pnlAppliedToCategories').show();
                    $('#pnlAppliedToProductVariants').hide();
                }
                else if (selectedDiscountTypeId == @(((int)DiscountType.AssignedToSkus).ToString())) {
                    $('#pnlAppliedToCategories').hide();
                    $('#pnlAppliedToProductVariants').show();
                }
                else {
                    $('#pnlAppliedToCategories').hide();
                    $('#pnlAppliedToProductVariants').hide();
                }
            }

            function toggleLimitation() {
                var selectedDiscountLimitationId = $("#@Html.FieldIdFor(model => model.DiscountLimitationId)").val();
                if (selectedDiscountLimitationId == @(((int)DiscountLimitationType.NTimesOnly).ToString()) || selectedDiscountLimitationId == @(((int)DiscountLimitationType.NTimesPerCustomer).ToString())) {
                    //'N Times Only' or 'N Times Per Customer'
                    $('#pnlLimitationTimes').show();
                }
                else {
                    $('#pnlLimitationTimes').hide();

                }
            }

            function toggleUsePercentage() {
                if ($('#@Html.FieldIdFor(model => model.UsePercentage)').is(':checked')) {
                    $('#pnlDiscountPercentage').show();
                    $('#pnlDiscountAmount').hide();
                }
                else {
                    $('#pnlDiscountPercentage').hide();
                    $('#pnlDiscountAmount').show();
                }
            }

            function toggleRequiresCouponCode() {
                if ($('#@Html.FieldIdFor(model => model.RequiresCouponCode)').is(':checked')) {
                    $('#pnlCouponCode').show();
                }
                else {
                    $('#pnlCouponCode').hide();
                }
            }
            
    </script>
    
        
    <table class="adminContent">
        <tr>
            <td class="adminTitle">
                @Html.NopLabelFor(model => model.Name):
            </td>
            <td class="adminData">
                @Html.EditorFor(model => model.Name)
                @Html.ValidationMessageFor(model => model.Name)
            </td>
        </tr>
        <tr>
            <td class="adminTitle">
                @Html.NopLabelFor(model => model.DiscountTypeId):
            </td>
            <td class="adminData">
                @Html.DropDownListFor(model => model.DiscountTypeId, ((DiscountType)Model.DiscountTypeId).ToSelectList())
                @Html.ValidationMessageFor(model => model.DiscountTypeId)
            </td>
        </tr>
        <tr id="pnlAppliedToCategories">
            <td class="adminTitle">
                @Html.NopLabelFor(model => model.AppliedToCategoryModels):
            </td>
            <td class="adminData">
                @if (Model.AppliedToCategoryModels.Count > 0)
                {
                    for (int i = 0; i < Model.AppliedToCategoryModels.Count; i++)
                    {
                        var categoryId = Model.AppliedToCategoryModels[i].CategoryId;
                        var categoryName = Model.AppliedToCategoryModels[i].Name;
                        <a href="@Url.Action("Edit", "Category", new { id = categoryId })">@categoryName</a>
                        if (i != Model.AppliedToCategoryModels.Count - 1)
                        {
                            <text>, </text>
                        }
                    }
                }
                else
                {
                    @T("Admin.Promotions.Discounts.Fields.AppliedToCategories.NoRecords")
                }
            </td>
        </tr>
        <tr id="pnlAppliedToProductVariants">
            <td class="adminTitle">
                @Html.NopLabelFor(model => model.AppliedToProductVariantModels):
            </td>
            <td class="adminData">
                @if (Model.AppliedToProductVariantModels.Count > 0)
                {
                    for (int i = 0; i < Model.AppliedToProductVariantModels.Count; i++)
                    {
                        var productVariantId = Model.AppliedToProductVariantModels[i].ProductVariantId;
                        var fullProductName = Model.AppliedToProductVariantModels[i].FullProductName;
                        <a href="@Url.Action("Edit", "ProductVariant", new { id = productVariantId })">@fullProductName</a>
                        if (i != Model.AppliedToProductVariantModels.Count - 1)
                        {
                            <text>, </text>
                        }
                    }
                }
                else
                {
                    @T("Admin.Promotions.Discounts.Fields.AppliedToProductVariants.NoRecords")
                }
            </td>
        </tr>
        <tr>
            <td class="adminTitle">
                @Html.NopLabelFor(model => model.UsePercentage):
            </td>
            <td class="adminData">
                @Html.EditorFor(model => model.UsePercentage)
                @Html.ValidationMessageFor(model => model.UsePercentage)
            </td>
        </tr>
        <tr id="pnlDiscountAmount">
            <td class="adminTitle">
                @Html.NopLabelFor(model => model.DiscountAmount):
            </td>
            <td class="adminData">
                @Html.EditorFor(model => model.DiscountAmount) [@Model.PrimaryStoreCurrencyCode]
                @Html.ValidationMessageFor(model => model.DiscountAmount)
            </td>
        </tr>
        <tr id="pnlDiscountPercentage">
            <td class="adminTitle">
                @Html.NopLabelFor(model => model.DiscountPercentage):
            </td>
            <td class="adminData">
                @Html.EditorFor(model => model.DiscountPercentage)
                @Html.ValidationMessageFor(model => model.DiscountPercentage)
            </td>
        </tr>
        <tr>
            <td class="adminTitle">
                @Html.NopLabelFor(model => model.StartDateUtc):
            </td>
            <td class="adminData">
                @Html.EditorFor(model => model.StartDateUtc)
                @Html.ValidationMessageFor(model => model.StartDateUtc)
            </td>
        </tr>
        <tr>
            <td class="adminTitle">
                @Html.NopLabelFor(model => model.EndDateUtc):
            </td>
            <td class="adminData">
                @Html.EditorFor(model => model.EndDateUtc)
                @Html.ValidationMessageFor(model => model.EndDateUtc)
            </td>
        </tr>
        <tr>
            <td class="adminTitle">
                @Html.NopLabelFor(model => model.RequiresCouponCode):
            </td>
            <td class="adminData">
                @Html.EditorFor(model => model.RequiresCouponCode)
                @Html.ValidationMessageFor(model => model.RequiresCouponCode)
            </td>
        </tr>
        <tr id="pnlCouponCode">
            <td class="adminTitle">
                @Html.NopLabelFor(model => model.CouponCode):
            </td>
            <td class="adminData">
                @Html.EditorFor(model => model.CouponCode)
                @Html.ValidationMessageFor(model => model.CouponCode)
            </td>
        </tr>
        <tr>
            <td class="adminTitle">
                @Html.NopLabelFor(model => model.DiscountLimitationId):
            </td>
            <td class="adminData">
                @Html.DropDownListFor(model => model.DiscountLimitationId, ((DiscountLimitationType)Model.DiscountLimitationId).ToSelectList())
                @Html.ValidationMessageFor(model => model.DiscountLimitationId)
            </td>
        </tr>
        <tr id="pnlLimitationTimes">
            <td class="adminTitle">
                @Html.NopLabelFor(model => model.LimitationTimes):
            </td>
            <td class="adminData">
                @Html.EditorFor(model => model.LimitationTimes)
                @Html.ValidationMessageFor(model => model.LimitationTimes) @T("Admin.Promotions.Discounts.Fields.LimitationTimes.Times")
            </td>
        </tr>
    </table>
}
@helper TabRequirements()
    {
        if (Model.Id > 0)
        {
        
    <script type="text/javascript">
            
            $(document).ready(function () {
            
                $("#@Html.FieldIdFor(model => model.AddDiscountRequirement)").change(loadNewRequirementBox);

                //load add requirement box
                loadNewRequirementBox();

                //load existing requirements
                loadExistingRequirements();
                           
               //adding requirement event
               $("#discountRequirementContainer").bind('nopnewdiscountruleadded', function(event, newRequirementId) {
  
                    var discountId = @Model.Id;
                    $.ajax({
                        cache:false,
                        type: "POST",
                        url: "@(Url.Action("GetDiscountRequirementMetaInfo", "Discount"))",
                        data: { "discountRequirementId": newRequirementId, "discountId": discountId },
                        success: function (result) {                            
                            discountRequirements.push({ discountRequirementId: newRequirementId, ruleName : result.ruleName, url : result.url });
                            loadExistingRequirements();
                        },
                        error:function (xhr, ajaxOptions, thrownError) {
                            alert('Failed to load new discount requirement info. Please refresh the page');
                        }
                    });

               });
            });

                
            //load requirement HTML
            function loadRequirement(configureRuleUrl, placeholderName) {
                $.ajax({
                    cache:false,
                    url: configureRuleUrl,
                    dataType: "html",
                    success: function (result) {
                        $(placeholderName).html(result);
                    },
                    error:function (xhr, ajaxOptions, thrownError) {
                        $(placeholderName).html('Failed to load requirement content.');
                    }
                });
            }

            //load HTML for adding requirement
            function loadNewRequirementBox() {
                //load URL
                var ruleSystemName = $("#@Html.FieldIdFor(model => model.AddDiscountRequirement)").val();
                var discountId = @Model.Id;
                if (ruleSystemName != '') {
                    $.ajax({
                        cache:false,
                        url: "@(Url.Action("GetDiscountRequirementConfigurationUrl", "Discount"))",
                        data: { "systemName": ruleSystemName, "discountId": discountId },
                        success: function (result) {
                                var configureRuleUrl = result.url;
                                //now load the content
                                loadRequirement(configureRuleUrl, '#addrequirementplaceholder');
                        },
                        error:function (xhr, ajaxOptions, thrownError){
                            $('#addrequirementplaceholder').html('Failed to load requirement URL');
                        }  
                    });
                }
                else {
                    $('#addrequirementplaceholder').html('');
                }
            }

           //array of exisiting discount requirements
           var discountRequirements = [
                    @for (int i = 0; i < Model.DiscountRequirementMetaInfos.Count; i++)
                    {
                        var drmi = Model.DiscountRequirementMetaInfos[i];
                        <text>{ discountRequirementId: @(drmi.DiscountRequirementId), ruleName: "@(drmi.RuleName)", url:  "@(Html.Raw(drmi.ConfigurationUrl))" } </text> if (i != Model.DiscountRequirementMetaInfos.Count - 1)
                                                                                                                                                                         {<text>, </text>}

                    }
               ];
           
           //load HTML for exisiting requirements
           function loadExistingRequirements() {
               $("#discountRequirementContainer").html('');
               $("#discountRequirementTemplate").tmpl(discountRequirements).appendTo("#discountRequirementContainer");

               var discountRequirementsLen = discountRequirements.length;
               for (var i=0; i<discountRequirementsLen; i++) {
                   var url = discountRequirements[i].url;
                   var discountRequirementId = discountRequirements[i].discountRequirementId;
                   var placeholderName = '#editrequirementplaceholder' + discountRequirementId;
                   $(placeholderName).html('loading...');
                   loadRequirement(url, placeholderName);
               }
           }

           //delete requirement rule
           function deleteRequirement(discountRequirementId) {           
                var discountId = @Model.Id;                
                $.ajax({
                    cache:false,
                    type: "POST",
                    url: "@(Url.Action("DeleteDiscountRequirement", "Discount"))",
                    data: { "discountId": discountId, "discountRequirementId": discountRequirementId },
                    success: function (data) {
                        removeRequirementByElement(discountRequirements, discountRequirementId)
                        loadExistingRequirements();
                    },
                    error:function (xhr, ajaxOptions, thrownError){
                        alert('Failed to delete requirement.');
                    }  
                });

                
            function removeRequirementByElement(arrayName,discountRequirementId) {
                for(var i=0; i<arrayName.length; i++) {
                    if(arrayName[i].discountRequirementId==discountRequirementId) {
                        arrayName.splice(i,1);
                    }
                }
             }

        }

    </script>
    <!-- Template container -->
    <div id="discountRequirementContainer">
    </div>
    <!-- Discount requirement template -->
    <script id="discountRequirementTemplate" type="text/html">
            <div id="editrequirement{{= discountRequirementId }}">
                <div>@T("Admin.Promotions.Discounts.Requirements.DiscountRequirementType"): <strong>{{= ruleName }}</strong></div>
                <div id="editrequirementplaceholder{{= discountRequirementId }}" style="float:left;"></div>
                <div style="float:right;">
                    <input type="button" id="deleterequirement{{= discountRequirementId }}" onclick="deleteRequirement({{= discountRequirementId }})" class="t-button" value="@T("Admin.Promotions.Discounts.Requirements.Remove")" />
                </div>
                <table class="adminContent">
                    <tr class="adminSeparator">
                        <td colspan="2">
                            <hr />
                        </td>
                    </tr>
                </table>
            </div>
    </script>
            
    <table class="adminContent">
        <tr>
            <td colspan="2">
                <strong>@T("Admin.Promotions.Discounts.Requirements.AddNew")</strong>
            </td>
        </tr>
        <tr>
            <td class="adminTitle">
                @Html.NopLabelFor(model => model.AddDiscountRequirement):
            </td>
            <td class="adminData">
                @Html.DropDownListFor(model => model.AddDiscountRequirement, Model.AvailableDiscountRequirementRules)
                @Html.ValidationMessageFor(model => model.AddDiscountRequirement)
            </td>
        </tr>
    </table>
    <table class="adminContent">
        <tr>
            <td colspan="2">
                <div id="addrequirementplaceholder">
                </div>
            </td>
        </tr>
    </table>
        }
        else
        {
    @T("Admin.Promotions.Discounts.Requirements.SaveBeforeEdit")
        }
}
@helper TabHistory()
    { 
    
        var gridPageSize = EngineContext.Current.Resolve<Nop.Core.Domain.Common.AdminAreaSettings>().GridPageSize;
    @(Html.Telerik().Grid<DiscountModel.DiscountUsageHistoryModel>()
                    .Name("usagehistory-grid")
                    .DataKeys(x =>
                    {
                        x.Add(y => y.Id).RouteKey("Id");
                        x.Add(y => y.DiscountId).RouteKey("discountId");
                    })
                    .Columns(columns =>
                    {
                        columns.Bound(x => x.OrderId)
                            .Width(100)
                            .Template(x => Html.ActionLink(T("Admin.Common.View").Text, "Edit", "Order", new { id = x.OrderId }, new { }))
                            .ClientTemplate("<a href=\"" + @Url.Content("~/Admin/Order/Edit/") + "<#= OrderId #>\">" + T("Admin.Common.View").Text + "</a>");
                        columns.Bound(x => x.CreatedOn).Width(200);
                        columns.Command(commands =>
                        {
                            commands.Delete().Text(T("Admin.Common.Delete").Text);
                        }).Width(100).Title(T("Admin.Common.Delete").Text);

                    })
                    .Pageable(settings => settings.PageSize(gridPageSize).Position(GridPagerPosition.Both))
                    .DataBinding(dataBinding =>
                    {
                        dataBinding.Ajax().Select("UsageHistoryList", "Discount", new { discountId = Model.Id })
                            .Delete("UsageHistoryDelete", "Discount");
                    })
                    .EnableCustomBinding(true))
        
}